
// 不定参宏函数

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>


// ##__VA_ARGS__是一个宏定义，在C语言中用于处理可变参数的宏
// 它可以在预处理阶段将不定数量的参数展开成一个参数列表
// 具体的使用方式是将宏定义为带有省略号的参数列表，并使用##将参数连接在一起
// 这样可以在宏中处理任意数量的参数
#define LOG(fmt, ...) printf("[%s : %d] " fmt, __FILE__, __LINE__, ##__VA_ARGS__)

void print_num(int cnt, ...)
{
    // man va_start
    va_list ap;

    // 获取不定参数的起始地址
    // 这里就是获取cnt参数后的第一个参数的地址
    va_start(ap, cnt);

    for(int i = 0; i < cnt; ++i)
    {
        int num = va_arg(ap, int);
        printf("%d ", num);
    }
    printf("\n");

    // 将ap指针置空
    va_end(ap);
}

void my_print(char *str, ...)
{
    va_list ap;
    va_start(ap, str);

    // man vasprintf
    char *res;
    int ret = vasprintf(&res, str, ap);
    if(ret != -1)
    {
        printf(res);
        free(res);
    }

    va_end(ap);
}

int main()
{
    LOG("violet\n");

    print_num(2, 10, 20);
    print_num(5, 1, 2, 3, 4, 5);

    my_print("%s %d\n", "hello world", 10);
    my_print("evergarden\n");

    return 0;
}